package spring.event;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.Random;

/**
 * Spring 事件驱动: 注解实现 事件的监听
 *
 * @author ME
 */
@Component
public class AnnotationEventListener {

    /**
     * value 必须给值, 但可以不用是 ApplicationEvent的子类, 任意事件都 ok
     *
     * @param event 代表事件的类型
     */
    @EventListener(
            value = {HungerEvent.class}
            // condition 的使用，若同一个事件进行区分同步异步 等等条件的可以使用此 condition 支持 spel表达式  非常强大
            // ,condition = "#event.isAsync == false"
    )
    @Async
    public void handleHungerEvent(HungerEvent event) {
        if (new Random().nextBoolean()) {
            throw new RuntimeException("3233");
        }
        System.out.println("[Event Consumer]: Thread-" + Thread.currentThread().getName() +" 开始响应事件。\n" +
                "\t事件触发了, 当前事件是: " + event.getSource());
    }

    // @EventListener(value = {ContextRefreshedEvent.class})
    public void handleContextRefreshedEvent(ApplicationEvent event) {
        System.out.println("ContextRefreshedEvent 触发了。。");
    }

}
